﻿<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<meta content="zh-cn" http-equiv="Content-Language" />
<title>Cdec Quick Manual - Curl Cdec</title>
<link href="../main.css" rel="stylesheet" type="text/css" />
</head>

<body>

<h1>Curl Cdec</h1>
<h2>综述</h2>
<p>工程 curlcdec 使用 <a href="http://curl.haxx.se/">libcurl</a> 提供的 HTTP 等协议客户端实现。为使用简单，适用于 Windows 平台的源文件已经包含在 Cdec 
源码包中；Linux 版本下需要自行安装所需的库（curl, curl-devel）。</p>
<h2>概念模型</h2>
<p>Curl Cdec 是对 libcurl 库的封装。主要用于实现 HTTP 客户端。</p>
<p>CurlEasy 是访问 CURL 库简单接口集合的主类。创建一个 CurlEasy 实例，设置各种调用参数后，调用 Request 方法，然后通过返回的 
CurlResponse 对象获得结果。</p>
<p>调用 Request 方法时，可以使用自己的 ICurlResponseWriter 实现。这种情况下，HTTP 调用结果将传到该 
ICurlResponseWriter 实现，而不是默认的 CurlResponse。实现该类同时还需要实现 ICurlContentWriter 或使用 
Curl Cdec 提供的默认实现，用于接收 Response body 数据。</p>
<h2>使用 Easy 对象</h2>
<h3>Sample 读取网页</h3>
<pre class="code">ref&lt;CurlEasy&gt; curl = gc_new&lt;CurlEasy&gt;();
curl-&gt;SetUrl(url);
ref&lt;CurlResponse&gt; response = curl-&gt;Request();
int responseCode = response-&gt;GetResponseCode();
stringx text = response-&gt;GetString();</pre>
<p>CurlResponse 类提供了 GetStream, GetBytes, GetString 
三种方法，分别返回流（MemoryStream）、Byte 数组和 UTF-8 解码后的字符串。</p>
<h3>Sample 设置 POST 数据</h3>
<p>使用 SetPostText 方法可以设置 POST 文本（将用 UTF-8 编码）：</p>
<pre class="code">ref&lt;CurlEasy&gt; curl = gc_new&lt;CurlEasy&gt;();
curl-&gt;SetUrl(url);
curl-&gt;SetPostText(__X(&quot;name=abc&amp;value=123&quot;));</pre>
<p>该方法将默认设置 POST 格式为 application/x-www-form-urlencoded。如果要设置其他的格式，可以手动设置 
Content-Type 头。</p>
<pre class="code">ref&lt;CurlEasy&gt; curl = gc_new&lt;CurlEasy&gt;();
curl-&gt;SetUrl(url);
curl-&gt;AddHeader(__X(&quot;Content-Type&quot;), __X(&quot;text/plain&quot;));
curl-&gt;SetPostText(__X(&quot;name=abc&amp;value=123&quot;));</pre>
<p>一般情况下，请不要手动设置 Content-Length 头。</p>
<p>另外，SetPostBytes 和 SetPostStream 可以设置 Byte 数组和流。</p>
<h3>读取 Response Headers</h3>
<p>在初始化时，使用 CCO_ResponseHeaders 来指示 Curl Easy 处理 Response headers。</p>
<p>参考代码如下。</p>
<pre class="code">ref&lt;CurlEasy&gt; curl = gc_new&lt;CurlEasy&gt;(CCO_ResponseHeaders);
curl-&gt;SetUrl(&quot;http://www.google.com/&quot;);
ref&lt;CurlResponse&gt; response = curl-&gt;Request();

Console::WriteLine(__X(&quot;Response code: &quot;) + Converter::ToString(response-&gt;GetResponseCode()));
Console::WriteLine(__X(&quot;State: &quot;) + response-&gt;GetHttpState());
ref&lt;CurlResponse::HeaderMap&gt; headers = response-&gt;GetHeaders();
foreach (CurlResponse::HeaderMap::KeyValuePair, pair, headers)
Console::WriteLine(&#39;\&quot;&#39; + pair.first + __X(&quot;\&quot; : \&quot;&quot;) + pair.second + &#39;\&quot;&#39;);</pre>
<h3>其他 HTTP 命令</h3>
<p>SetPutBytes 和 SetPutStream 可以发出 HTTP PUT 请求，其使用方法类似 POST 请求。</p>
<p>SetCustomRequest 可以发出非标准 HTTP 命令。</p>
<h3>自定义 Response 接收者</h3>
<p>Request 方法接受自定义的 ICurlResponseWriter 实现。请参考 CurlResponse 来实现自己的 Response 接收器。</p>
<p>实现 Response writer 时需要 ICurlContentWriter 的实现，可以自行实现或使用现有的（例如 
StreamCurlContentWriter）。</p>
<h2>Windows 工程编译</h2>
<p>为使用方便，Cdec 代码库已经包含了适用于 Visual C++ 2010 的 libcurl 二进制文件。位于 
import-win\curl-7.31.0。该目录结构如下。</p>
<ul>
	<li>include 目录：头文件，由 curlcdec.h 自动引用</li>
	<li>lib 目录：LIB 文件，使用工程需要显式连接</li>
	<li>bin 目录：CURL 可执行文件，不需要使用</li>
</ul>
<p>也可以自行下载和编译 libcurl 库。</p>
<hr />
<p><a href="index.html">C-- Quick Manual</a></p>

</body>

</html>
